package array;

/**
 * 283. 移动零
 * <p>
 * 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
 * 请注意 ，必须在不复制数组的情况下原地对数组进行操作。
 * <p>
 * 示例 1:
 * 输入: nums = [0,1,0,3,12]
 * 输出: [1,3,12,0,0]
 * <p>
 * 示例 2:
 * 输入: nums = [0]
 * 输出: [0]
 */
public class Problem_283 {
    public static void main(String[] args) {
        int[] nums = {1, 0};
        new Problem_283().moveZeroes(nums);
        System.out.println(nums);
    }

    /**
     * 使用双指针，左指针指向当前已经处理好的序列的尾部，右指针指向待处理序列的头部。
     * 右指针不断向右移动，每次右指针指向非零数，则将左右指针对应的数交换，同时左指针右移。
     *
     * @param nums
     */
    public void moveZeroes(int[] nums) {
        int zeroIndex = 0;
        int changeIndex = 0;

        while (changeIndex < nums.length) {
            while (zeroIndex < nums.length && nums[zeroIndex] != 0) {
                zeroIndex++;
            }

            while (changeIndex < nums.length && nums[changeIndex] == 0) {
                changeIndex++;
            }

            if (changeIndex < nums.length && zeroIndex < changeIndex) {
                int temp = nums[zeroIndex];
                nums[zeroIndex] = nums[changeIndex];
                nums[changeIndex] = temp;
            }
            changeIndex++;

        }

    }

}
